#ifndef PLAYIMAGE_H
#define PLAYIMAGE_H

#include <QWidget> // 修改基类为 QWidget，以便更好地管理布局和覆盖层
#include <QOpenGLFunctions_3_3_Core>
#include <qopenglshaderprogram.h>
#include <QOpenGLTexture>
#include <qopenglpixeltransferoptions.h>
#include <QOpenGLWidget> // 内部包含一个 QOpenGLWidget 用于实际渲染
#include <QLabel>        // 用于文字叠加
#include <QString>

struct AVFrame;

// 内部用于 OpenGL 渲染的 Widget
class GLWidget : public QOpenGLWidget, public QOpenGLFunctions_3_3_Core
{
    Q_OBJECT
public:
    explicit GLWidget(QWidget* parent = nullptr);
    ~GLWidget() override;

    void repaint(AVFrame* frame);
    QSize getVideoSize() const { return m_size; } // 添加获取视频尺寸的方法

signals:
    void videoSizeChanged(const QSize& newSize); // 尺寸变化时发出信号

protected:
    void initializeGL() override;
    void resizeGL(int w, int h) override;
    void paintGL() override;

private:
    QOpenGLShaderProgram* m_program = nullptr;
    QOpenGLTexture* m_texY = nullptr;
    QOpenGLTexture* m_texU = nullptr;
    QOpenGLTexture* m_texV = nullptr;
    QOpenGLPixelTransferOptions m_options;

    GLuint VBO = 0;
    GLuint VAO = 0;
    GLuint EBO = 0;
    QSize  m_size;      // 视频帧的原始尺寸
    QRectF m_renderRect; // 计算出的在窗口中渲染的区域 (保持比例)

    // 顶点和索引数据声明为静态或移到 .cpp
    static const GLfloat vertices[];
    static const GLuint indices[];
};


// 封装后的 PlayImage 类，包含 GLWidget 和 QLabel
class PlayImage : public QWidget
{
    Q_OBJECT
public:
    explicit PlayImage(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
    ~PlayImage() override;

    void repaint(AVFrame* frame); // 转发给内部 GLWidget
    void setUserInfo(int userId, const QString& userName); // 设置用户信息
    int getUserId() const;
    QString getUserName() const;
    void setBlackBackground(); // 设置纯黑背景 (用于无视频时)

    // --- 修改开始: 添加与宽高比相关的函数 ---
    int heightForWidth(int w) const override; // 重写 heightForWidth
    QSize sizeHint() const override;          // 重写 sizeHint (可选但推荐)
    // --- 修改结束 ---
    void updateLabelPosition(); // 提取更新标签位置的逻辑
signals:
    void clicked(int userId); // 点击时发出信号

protected:
    void mousePressEvent(QMouseEvent *event) override; // 处理点击
    void resizeEvent(QResizeEvent *event) override; // 声明 resizeEvent
    void paintEvent(QPaintEvent *event) override;   // 声明 paintEvent

private slots:
    // --- 修改开始: 添加槽函数处理视频尺寸变化 ---
    void onVideoSizeChanged(const QSize& newSize);
    // --- 修改结束 ---

private:


    GLWidget* m_glWidget = nullptr;     // 实际渲染 OpenGL 的控件
    QLabel* m_overlayLabel = nullptr; // 用于显示用户信息的标签
    int m_userId = -1;
    QString m_userName;
    bool m_isBlack = false; // 是否为纯黑背景

    // --- 修改开始: 添加宽高比成员 ---
    float m_aspectRatio = 16.0f / 9.0f; // 默认宽高比 (宽/高)
    // --- 修改结束 ---
};

#endif // PLAYIMAGE_H
